'''
读取包含词性的文本(经过处理完spacy分词问题的句子），根据label_list得到包含词性的实体
'''
import json


# 加载label数据
label_path = '../../../dataset/twitter2017/texts/test_text.json'

text_tag_data = []
labels_data = []
# 去读label
with open(label_path, 'r', encoding='utf8')as fp:
    text_json_data = json.load(fp)
for i in range(0, len(text_json_data)):
    labels_data.append(text_json_data[i]["label"])

# 读取text
text_path = '../../text/no_spacy_pro/test_text.json'
with open(text_path, 'r', encoding='utf8')as f1:
    text_datas = f1.readlines()


# 得到包含词性的实体
def ner():
    ner_lists = []  # 存储所有文本的ner_list
    for index in range(0, len(labels_data)):    # 遍历每行文本
        # text_tag_list = text_tag_data[index]
        text_list = json.loads(text_datas[index]).split()
        label_list = labels_data[index]

        ner_list = []       # 存储每个文本中的实体
        ner_tag_str = ''    # 暂存每个句子中的某个实体与词性

        label_list_len = len(label_list)
        i = 0
        while i < label_list_len:   # 遍历某文本的label列表得到对应的实体
            # 得到实体字符串ner_str
            if label_list[i] != 'O':
                ner_tag_str = text_list[i]
                j = i + 1
                while j < label_list_len and label_list[j] != 'O':
                    ner_tag_str = ner_tag_str + ' ' + text_list[j]
                    j = j + 1
                i = j
            else:
                if len(ner_tag_str) != 0:
                    ner_list.append(ner_tag_str)
                    ner_tag_str = ''    # 清空本次得到的实体字符串
                i = i + 1
        # 用于最后一个token是实体时保存ner_tag_str
        if len(ner_tag_str) != 0:
            ner_list.append(ner_tag_str)

        ner_lists.append(ner_list)    # 保存本行文本的实体列表
    return ner_lists

if __name__ == '__main__':
    ner_lists = ner()
    # 为保证存入文件之后数据类型依然为列表，所以采用如下方式将数据写入.json文件，方便其它文件夹读取出的数据依然为列表类型
    with open('test_ner.json', 'w', encoding='utf8')as f:
        for i in range(0, len(ner_lists)):
            f.write(json.dumps(ner_lists[i]) + '\n')        # 使用json.dumps()将数据编码为json格式




